--[[
	The "compress" tests are currently disabled, and may not ever be enabled again.

	Unit testing that our compression implementation produces the exact result saved
	in test files is very fragile and prone to breakage whenever one of the crates
	we depend on for compression algorithms updates, be it to improve compression
	ratio, speed, memory usage, or any other metric.

	Instead, we should focus on the correctness of the implementation, ensuring that
	any files we know are good from other sources can be decompressed without issues.

	In the future, it is probably a good idea to rewrite these compression tests so
	that they do not rely on any exact output, but instead call some external program
	to verify that others can decompress without issues. This is a challenge in and of
	itself since finding CLI programs for testing compression is near-impossible, but alas.
]]
local TEST_COMPRESS = false
local TEST_DECOMPRESS = true

local fs = require("@lune/fs")
local process = require("@lune/process")
local serde = require("@lune/serde")
local stdio = require("@lune/stdio")

type Test = {
	Format: serde.CompressDecompressFormat,
	Source: string,
	Target: string,
}

local TESTS: { Test } = {
	{
		Format = "brotli",
		Source = "tests/serde/test-files/loremipsum.txt",
		Target = "tests/serde/test-files/loremipsum.txt.br",
	},
	{
		Format = "gzip",
		Source = "tests/serde/test-files/loremipsum.txt",
		Target = "tests/serde/test-files/loremipsum.txt.gz",
	},
	{
		Format = "lz4",
		Source = "tests/serde/test-files/loremipsum.txt",
		Target = "tests/serde/test-files/loremipsum.txt.lz4",
	},
	{
		Format = "zlib",
		Source = "tests/serde/test-files/loremipsum.txt",
		Target = "tests/serde/test-files/loremipsum.txt.z",
	},
	{
		Format = "zstd",
		Source = "tests/serde/test-files/loremipsum.txt",
		Target = "tests/serde/test-files/loremipsum.txt.zst",
	},
}

local failed = false
local function testOperation(
	operationName: "Compress" | "Decompress",
	operation: (
		format: serde.CompressDecompressFormat,
		s: buffer | string
	) -> string,
	format: serde.CompressDecompressFormat,
	source: string | buffer,
	target: string
)
	local success, res = pcall(operation, format, source)
	if not success then
		stdio.ewrite(
			string.format(
				"%sing source using '%s' format threw an error!\n%s",
				operationName,
				tostring(format),
				tostring(res)
			)
		)
		failed = true
	elseif res ~= target then
		stdio.ewrite(
			string.format(
				"%sing source using '%s' format did not produce target!\n",
				operationName,
				tostring(format)
			)
		)
		stdio.ewrite(
			string.format(
				"%sed (%d chars long):\n%s\nTarget (%d chars long):\n%s\n\n",
				operationName,
				#res,
				tostring(res),
				#target,
				tostring(target)
			)
		)
		failed = true
	end
end

for _, test in TESTS do
	local source = fs.readFile(test.Source)
	local target = fs.readFile(test.Target)

	-- Compression
	if TEST_COMPRESS then
		testOperation("Compress", serde.compress, test.Format, source, target)
		testOperation("Compress", serde.compress, test.Format, buffer.fromstring(source), target)
	end

	-- Decompression
	if TEST_DECOMPRESS then
		testOperation("Decompress", serde.decompress, test.Format, target, source)
		testOperation(
			"Decompress",
			serde.decompress,
			test.Format,
			buffer.fromstring(target),
			source
		)
	end
end

if failed then
	process.exit(1)
end
